#pragma once
#include "Population.h"
#include "../TermEngine/TermSet.h"

class mapIndDoub;
class SubroutinePopulation {


public:	
	static  EvaluatingTermSet*	BlockPopulation( EvaluatingTermSet* = NULL);
	static vector<const Token*>* StemCells (vector<const Token*>* = NULL);
	static const Type* GoalType (const Type* = NULL);

public:
		static Token::const_reference BlockPopulationGenerator(   
			vector< Token::pointer (*) (const Token&)>* ,
			bool (*)( Token::const_reference ) = NULL);

		static Token::pointer createNewBlock( vector< Token::pointer (*) (const Token&)>* );
		
		static Token::pointer Method_2_1(const Token&);
        static Token::pointer Method_2_2(const Token&);
		static Token::pointer Method_2_3(const Token&);
		static Token::pointer Method_2_4(const Token&);
		static Token::pointer Method_2_5(const Token&);
		static Token::pointer Method_2_6(const Token&);

		static Token::pointer Method_3_3(const Token&);
		static Token::pointer Method_3_4(const Token&);

public:
		static vector< Token::pointer (*) (const Token&)>* getAllFormationRules( );
		static VirtualInvertedListTerm* CDNAStatementPopulationGenerator( void );
		
		static Individual CDNAStatementSpawnerWithoutSideEffect(const Individual, const Individual, Individual, size_t);
		static Individual CDNAStatementSpawnerWithSideEffect(const Individual, const Individual);
		static Individual CDNAStatementSpawner	(const Individual, const Individual);
		static void CDNAStatementMutator( Individual );
	};
